#ifndef APP_H
#define APP_H

// ###########################################################################################################################################
// MODELO DO RECURSOS DE HARDAWARES
#define MODEL			"hr01"
#define FIRMWARE_VERSION "1.0"
#define PROGAM_NAME "examples " MODEL " firmware v" FIRMWARE_VERSION " [compiled in " __DATE__ " " __TIME__ "]" CMD_TERMINATOR


// ###########################################################################################################################################
// INCLUDES OBRIGATÓRIAS
#include "_config_cpu_.h"
#include "stdio_uc.h"
#include "systick.h"
#include "delay.h"
#include "led_error.h"
#include "beep.h"
#include "gkey.h"
#include "ssp1.h"
#include "spi_ee25xx.h"
#include "rtc.h"

// ###########################################################################################################################################
// LEDs/GPIOs = OUTPUT
#define led1_DIR	GPIO2_DIR
#define led1_OFF	GPIO2_CLR
#define led1_ON		GPIO2_SET
#define LED1		BIT_0

#define led2_DIR	GPIO2_DIR
#define led2_OFF	GPIO2_CLR
#define led2_ON		GPIO2_SET
#define LED2		BIT_1

#define led3_DIR	GPIO1_DIR
#define led3_OFF	GPIO1_CLR
#define led3_ON		GPIO1_SET
#define LED3		BIT_28

#define led4_DIR	GPIO2_DIR
#define led4_OFF	GPIO2_CLR
#define led4_ON		GPIO2_SET
#define LED4		BIT_29

#define led5_DIR	GPIO0_DIR
#define led5_OFF	GPIO0_CLR
#define led5_ON		GPIO0_SET
#define LED5		BIT_30

#define led6_DIR	GPIO0_DIR
#define led6_OFF	GPIO0_CLR
#define led6_ON		GPIO0_SET
#define LED6		BIT_29

#define led1_Init()	(led1_DIR |= LED1)
#define led1_Off()	(led1_OFF = LED1)
#define led1_On()	(led1_ON = LED1)

#define led2_Init()	(led2_DIR |= LED2)
#define led2_Off()	(led2_OFF = LED2)
#define led2_On()	(led2_ON = LED2)

#define led3_Init()	(led3_DIR |= LED3)
#define led3_Off()	(led3_OFF = LED3)
#define led3_On()	(led3_ON = LED3)

#define led4_Init()	(led4_DIR |= LED4)
#define led4_Off()	(led4_OFF = LED4)
#define led4_On()	(led4_ON = LED4)

#define led5_Init()	(led5_DIR |= LED5)
#define led5_Off()	(led5_OFF = LED5)
#define led5_On()	(led5_ON = LED5)

#define led6_Init()	(led6_DIR |= LED6)
#define led6_Off()	(led6_OFF = LED6)
#define led6_On()	(led6_ON = LED6)



// ###########################################################################################################################################
// KEYBOARD

#define keyUP_PIN			GPIO1_PIN
#define keyUP_NUMPIN		BIT_18
#define keySET_PIN			GPIO1_PIN
#define keySET_NUMPIN		BIT_19
#define keyDOWN_PIN			GPIO1_PIN
#define keyDOWN_NUMPIN		BIT_20

#define keyUP 			1
#define keySET 			2
#define keyDOWN			4

// ###########################################################################################################################################
// RELAYS
typedef struct {
	int st; // estado dp rele
	volatile uint timeout; // contagem de tempo em ms para voltar ao estado anterior do rele
} tRelay, *pRelay;

// ###############################################################################
// CONTROL
typedef struct {
	volatile uint ticks;
	volatile char key;	// Valor do teclado pressionado
	tRelay relay1;
	tRelay relay2;
	tRTC rtc;
} tControl, *pControl;
tControl control;

void leds_Init(void);

void relay_Init(void);
void relay_Tick(void);
int relay_Set(int rly, int st, uint timeout);

void onKeyDown(char key);
void onKeyPress(char key);
void onKeyUp(char key);

void app_Init(void);
void app_Tick(void);
void app_Process(void);

void prompt_Process(void);

#endif
